;s14.asm

assume cs:code
code segment 
    start:	
        mov ax,0b800h 
        mov es,ax 
        mov bl,02h ;文字属性
        mov di,160*12+40*2

        mov al,9 ;从CMOS RAM的9单元读出当前月份的BCD码。
        call read_time 

        mov byte ptr es:[di-2], '/';
        mov byte ptr es:[di-1], bl 

        mov al,8 ;从CMOS RAM的8单元读出当前月份的BCD码。
        call read_time 

        mov byte ptr es:[di-2], "/" ;
        mov byte ptr es:[di-1], bl 

        mov al,7 ;从CMOS RAM的8单元读出当前日份的BCD码。
        call read_time 

        mov byte ptr es:[di-2], " " ;
        mov byte ptr es:[di-1], bl 

        mov al,4 ;从CMOS RAM的8单元读出当前日份的BCD码。
        call read_time 

        mov byte ptr es:[di-2], ":" ;
        mov byte ptr es:[di-1], bl 

        mov al,2 ;从CMOS RAM的8单元读出当前日份的BCD码。
        call read_time 

        mov byte ptr es:[di-2], ":" ;
        mov byte ptr es:[di-1], bl 

        mov al,0 ;从CMOS RAM的8单元读出当前日份的BCD码。
        call read_time 

        mov ax,4c00h
        int 21h
        ;------
        ;读取时间信息
        ; 参数 ax 端口地址 di显示缓冲区
        ; 返回值： 无
        ;-----
    read_time:
        push ax

        out 70h,al 
        in al, 71h ;从数据端口71h中取得指定单元中的数据,注意是一个字节的数据
        
        mov ah, al ;al中为从CMOS RAM的8号单元中读出的数据
        mov cl, 4
        shr ah, cl ;右移四位空出四位,ah中为月份的十位数码值
        and al, 00001111b ;al中为月份的个位数码值
        
        add ah, 30h ;十位 BCD码值+30h=十进制数对应的ASCII
        add al, 30h ;个位

        mov byte ptr es:[di], ah ;显示十位数码
        mov byte ptr es:[di+1], bl 
        mov byte ptr es:[di+2], al ;接着显示个位数码
        mov byte ptr es:[di+3], bl 

        add di,6 ;di增加6个字节 3个字。因为十位和个位占用两个字，一会符号会占用一个位置

        pop ax

        ret
        
code ends
end start